
// 扩展支持月、年的偏移日期计算，你发现这次扩展并没有再改动核心方法offset了，且你可以完全相信，扩展一个新的type不会为旧的代码带来bug

// 添加month/year两个值
type OffsetType = 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year'
interface OffsetComputeConfiguration {
    minute: number,
    second: number,
    hour: number,
    day: number,
    // 添加month/year两个属性
    month: number,
    year: number
}
interface ComputeOffsetDateTimeOptions {
    type: OffsetType
    offsetValue: number
    baseDateTime?: number
}

/**
 * 计算时间偏移量的工具函数，返回距离当前本地时间指定量的日期时间
 */
export default class TimeSpan {
    private static offsets: OffsetComputeConfiguration = {
        second: 1,
        minute: 60,
        hour: 60 * 60,
        day: 60 * 60 * 24,
        month: 60 * 60 * 24 * 31, // 当然这里31显然不对，因为存在28、29、30天的情况
        year: 60 * 60 * 24 * 365 // 365、366天同理
    }
    private static toDateTime(timeStamp: number): Date {
        return new Date(timeStamp)
    }
    /**
     * 
     * @param type 偏移类型
     * @param offsetValue 偏移量 
     * @param baseDateTime 基准时间，默认为当前时间
     * @returns 
     */
    public static offset(options: ComputeOffsetDateTimeOptions): Date {
        // 使用解构的方式赋默认值
        const { baseDateTime = Date.now(), offsetValue, type } = options
        return this.toDateTime(baseDateTime + offsetValue * this.offsets[type] * 1000)
    }
}

TimeSpan.offset({ type: 'second', offsetValue: 2 })
TimeSpan.offset({ type: 'minute', offsetValue: 2 })
TimeSpan.offset({ type: 'hour', offsetValue: 2 })
TimeSpan.offset({ type: 'day', offsetValue: 2 })
TimeSpan.offset({ type: 'month', offsetValue: 2 })
TimeSpan.offset({ type: 'year', offsetValue: 2 })

// 存在问题：OffsetType的值与OffsetComputeConfiguration的key一模一样，如果我在改代码时改错（拼写）其中一个，TS无法帮我检测出来